Due to computationally intensive applications, the need for high-performance computing/processing systems that interact with other computing/processing environments, for example, audio/video systems, control systems, networked applications, image processing, and the like, is ever increasing.
In general, a heterogeneous computing systems refers to a system that uses several different types of computational devices/modules. A computational device could be a general-purpose processor, a special-purpose processor, for example, a digital signal processor or graphics processing unit, a co-processor, or a custom application-specific integrated circuit (ASIC) or field-programmable gate array (FPGA), all of which include processors with different instruction set architectures. Conventionally, programming heterogeneous machines is complicated and time consuming since developing applications that make best use of characteristics of different processors increases the programmer's burden. Conventional methods that require hardware specific code to be included throughout the application code increases the complexity and decreases the portability of software on heterogeneous architectures.
Modern computing systems have many different types of processors, in terms of both power and architecture. In most cases, those processors are not used to their full potential. One of the issues that limits this under-utilization, is that there is no easy way to send portions of an application to be processed on a remote processor while allowing access to the local system resources.
Historically this problem has been solved by packaging isolated sections of data that require processing, and shipping off that data for remote processing. However, this conventional method only works for applications that contain data and processing that are capable of being isolated and do not need to interact with other system resources. An exemplary framework that does this is Hadoop™, which utilizes the Hadoop Distributed File System (HDFS) to distribute data to its compute nodes, and then schedules processing with a JobTracker.